package com.fwx.basic.static_keyword;

/**
 * @author : fengwenxiang
 * @date : 2022/5/12 22:50
 * @description：static静态变量的学习使用
 * 延伸static关键字的使用：静态方法、静态变量、静态代码块、静态类(延伸到内部类的内容)。
 * 所谓静态，指在编译后所分配的内存会一直存在，直到程序退出才会释放该空间。static修饰的内容有全局或静态的意思，
 * 其特点即：1.被修饰的变量或方法独立于该类的任何对象，也就是被类的所有实例共享。
 *          2.类加载阶段就会被初始化(静态代码块会直接执行)，因此可以在对象创建之前访问。也就是通过“类名.”的方式
 */
public class MyStatic {
    /**
     * 静态变量：被static的变量。
     * 静态变量被所有实例对象所共享，在内存中只有一个副本，仅当类初次加载时会被初始化
     */
    private static int index;

    /**
     * 实例变量：非静态变量也叫实例变量
     * 实例对象所拥有，在创建对象的时候被初始化，存在多个副本，各实例对象拥有的副本互不影响
     */
    private int count;

    static {
        System.out.println("类加载阶段,静态代码块只执行一次");
    }

    public void inc(){
        index ++;
        count ++;
    }
    public String get(){
        return "静态变量的值index = "+ index + ", 实例变量的值count = "+ count;
    }

    public static String test(){
        //静态方法中无法访问非静态变量,及this和super关键字不能使用。这些都需要关联实例对象
        return "index : "+index+"count : ";//+count;
    }

    /**可以创建静态内部类**/
    public static class A{

    }
}
/**不允许创建静态外部类**/
//public static class A{
//
//}